package fmripc.controller;

import fdupc.http.ResultBean;
import fdupc.http.function.ResultErrorFunction;
import fdupc.http.function.ResultManagerFunction;
import fdupc.http.function.ResultManagerNotReturnFunction;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import reactor.core.publisher.Mono;

/**
 * 类描述:  交互基础对象
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/9/28 0028 下午 7:41
 */
@Slf4j
public class BaskController implements IBaskController {


    /**
     * 功能描述：构造返回数据对象
     * <br />
     * 用于成功处理输出
     *
     * @return 需要输出的对象
     * @date : 2022/11/26 0026 下午 11:46
     */
    protected Mono<ResultBean> returnMonoBeanSuccess() {
        return returnMonoBeanSuccess(Boolean.TRUE);
    }

    /**
     * 功能描述：构造返回数据对象
     * <br />
     * 用于成功处理输出
     *
     * @param data    加载的数据
     * @return 需要输出的对象
     * @date : 2022/11/26 0026 下午 11:46
     */
    protected <T> Mono<ResultBean> returnMonoBeanSuccess(T data) {
        return returnMonoBeanSuccess(data, null);
    }

    /**
     * 功能描述：构造返回数据对象
     * <br />
     * 用于成功处理输出
     *
     * @param data    加载的数据
     * @param message 显示的信息
     * @return 需要输出的对象
     * @date : 2022/11/26 0026 下午 11:46
     */
    protected <T> Mono<ResultBean> returnMonoBeanSuccess(T data, String message) {
        final ResultBean resultBean = ResultBean.factorySuccess();
        if (data != null) {
            resultBean.setData(data);
        }
        resultBeanMsgManag(message, resultBean);
        return Mono.just(resultBean);
    }

    /**
     * 功能描述：构造返回数据对象
     * <br />
     * 用于异常处理输出
     *
     * @param message 显示的信息
     * @return 需要输出的对象
     * @date : 2022/11/26 0026 下午 11:46
     */
    protected Mono<ResultBean> returnMonoBeanError(String message) {
        return returnMonoBeanError(null, message);
    }

    /**
     * 功能描述：构造返回数据对象
     * <br />
     * 用于成功处理输出
     *
     * @return 需要输出的对象
     * @date : 2022/11/26 0026 下午 11:46
     */
    protected Mono<ResultBean> returnMonoBeanError() {
        return returnMonoBeanError(null, null);
    }

    /**
     * 功能描述：构造返回数据对象
     * <br />
     * 用于异常处理输出
     *
     * @param code    自定义返回码
     * @param message 显示的信息
     * @return 需要输出的对象
     * @date : 2022/11/26 0026 下午 11:46
     */
    protected Mono<ResultBean> returnMonoBeanError(Integer code, String message) {
        final ResultBean resultBean = ResultBean.factoryError();
        if (code != null) {
            resultBean.setCode(code);
        }
        resultBeanMsgManag(message, resultBean);
        return Mono.just(resultBean);
    }

    /**
     * 功能描述：返回对象提示信息处理
     * @date : 2022/11/26 0026 下午 11:51
     */
    private void resultBeanMsgManag(String message, ResultBean resultBean) {
        if (StringUtils.isNotEmpty(message)) {
            resultBean.setMsg(message);
        }
    }

    /**
     * 功能描述：交互统一返回对象业务构造
     * @date : 2022/11/27 0027 上午 12:26
     */
    public <R> Mono<ResultBean> buildToManager(ResultManagerFunction<R> managerFunction
            , ResultErrorFunction errorFunction){
        return Mono.just(ResultBean.buildToManager(managerFunction, errorFunction));
    }

    /**
     * 功能描述：交互统一返回对象业务构造
     * @date : 2022/11/27 0027 上午 12:26
     */
    public Mono<ResultBean> buildToManagerNotReturn(ResultManagerNotReturnFunction managerFunction
            , ResultErrorFunction errorFunction){
        return Mono.just(ResultBean.buildToManagerNotReturn(managerFunction, errorFunction));
    }
}
